#pragma once

#include<iostream>
#include<string>
#include<map>
#include<fstream>
#include<cstdint>
#include"Logger.hpp"

const std::string sep = ": ";

class Dictionary
{
private:
    //加载
    void LoadConf()
    {
        //1、打开文件
        std::ifstream in(_path);
        if(!in.is_open())
        {
            LOG(LogLevel::ERROR) << "文件打开失败";
            exit(0);
        }

        //2、分割字符串，判断是否合理，然后放入map 中
        //读取文件中的每一行
        std::string line;
        
        while(std::getline(in , line))//getline 读取到文件结束，返回值会强转为nullptr
        {
            ssize_t pos = line.find(sep.c_str());//find 返回的是下标
            if(pos == std::string::npos)
            {
                LOG(LogLevel::WARNING) << "格式错误：" << line;
                continue;//格式可能只有这一行有错误，跳过这一行就好
            }
            std::string key = line.substr(0 , pos);
            std::string value = line.substr(pos+sep.size());
            //判断key 和value 均不为空
            if(key.empty() || value.empty())
            {
                LOG(LogLevel::WARNING) << "key 或者 value , 其中有一个为空";
                continue;
            }
            _dict.insert(std::make_pair(key,value));
        }

        //3、关闭文件
        in.close();
    }
public:
    Dictionary(const std::string& path):_path(path)
    {
        //加载
        LoadConf();
    }
    ~Dictionary()
    {}
    //翻译
    std::string Translate(const std::string& word , const std::string& wordip , uint16_t wordport)
    {
        //此处暂不使用ip 和port
        (void)wordip;
        (void)wordport;

        //从map 中找value
        auto iter = _dict.find(word);
        // std::cout << word << std::endl;
        if(iter == _dict.end())
        {
            return "Unknown";
        }
        return iter->first  + "->" + iter->second;
    }

private:
    std::string _path;//所要加载文件的路径
    std::map<std::string , std::string> _dict;
};